function get_restrictor_manager(npc) if db.storage[npc:id()].restrictor_manager == nil then db.storage[npc:id()].restrictor_manager = Crestrictor_manager(npc) end return db.storage[npc:id()].restrictor_manager end class "Crestrictor_manager" function Crestrictor_manager:__init(obj) self.object = obj self.base_out_restrictions = {} self.base_in_restrictions = {} self.out_restrictions = parse_names(self.object:out_restrictions()) for k,v in pairs(self.out_restrictions) do self.base_out_restrictions[v] = true end self.in_restrictions = parse_names(self.object:in_restrictions()) for k,v in pairs(self.in_restrictions) do self.base_in_restrictions[v] = true end end local restr_tbl -- scoped because it's used by all online npc frequently and would be Garbage Collector waste function Crestrictor_manager:reset_restrictions(st, section) -- OUT RESTRICTIONS local actual_ini = st.ini local out_restr_string = get_param_string(actual_ini:r_string_ex(section, "out_restr") or "", self.object) local new_out_restr = parse_names(out_restr_string) local old_out_restr = parse_names(self.object:out_restrictions()) -- Remove old out restrictions restr_tbl = iempty_table(restr_tbl) local size_t = 0 local exist_rest for k,v in ipairs(old_out_restr) do exist_rest = false for kk,vv in ipairs(new_out_restr) do if v == vv then exist_rest = true break end end if exist_rest == false and self.base_out_restrictions[v] ~= true then size_t = size_t + 1 restr_tbl[size_t] = v end end for i=1,size_t do self.object:remove_restrictions(restr_tbl[i],"") end -- New out restrictions restr_tbl = iempty_table(restr_tbl) size_t = 0 for k,v in ipairs(new_out_restr) do exist_rest = false for kk,vv in ipairs(old_out_restr) do if v == vv then exist_rest = true break end end if exist_rest == false and v ~= "nil" then size_t = size_t + 1 restr_tbl[size_t] = v end end for i=1,size_t do self.object:add_restrictions(restr_tbl[i],"") end -- IN RESTRICTIONS local in_restr_string = get_param_string(actual_ini:r_string_ex(section, "in_restr") or "", self.object) local new_in_restr = parse_names(in_restr_string) local old_in_restr = parse_names(self.object:in_restrictions()) -- Remove old in restrictions restr_tbl = iempty_table(restr_tbl) size_t = 0 for k,v in ipairs(old_in_restr) do exist_rest = false for kk,vv in ipairs(new_in_restr) do if v == vv then exist_rest = true break end end if exist_rest == false and self.base_in_restrictions[v] ~= true then size_t = size_t + 1 restr_tbl[size_t] = v end end for i=1,size_t do self.object:remove_restrictions("",restr_tbl[i]) end -- New in restrictions restr_tbl = iempty_table(restr_tbl) size_t = 0 for k,v in ipairs(new_in_restr) do exist_rest = false for kk,vv in ipairs(old_in_restr) do if v == vv then exist_rest = true break end end if exist_rest == false and v ~= "nil" then size_t = size_t + 1 restr_tbl[size_t] = v end end for i=1,size_t do self.object:add_restrictions("",restr_tbl[i]) end end